﻿#ifndef MAINDESIGNER_H
#define MAINDESIGNER_H

#include <QWidget>
#include <QDebug>
#include <QDateTime>
#include <QColor>
#include <QTextCodec>
#include <QThread>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QListWidget>
#include <QPushButton>
#include <QElapsedTimer>
#include <QTimer>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>
#include <QVBoxLayout>
#include <QTableWidget>

#include <QGroupBox>
#include <QGridLayout>
#include <QTreeWidget>
#include <QTextEdit>
#include <QScrollArea>
#include <QFrame>
#include <QLabel>
#include <QHeaderView>
#include "configviewmanager.h"

namespace Ui {
class MainDesigner;
}
typedef struct{
    void *func;             //函数指针
    const char *name;       //函数名
    const char *info;       //函数说明
} _fun_nametab;

typedef struct{
    QString name;
    QString info;
    QString cmd;
} _fun_tab_struct;

class MainDesigner : public QWidget
{
    Q_OBJECT

public:
    explicit MainDesigner(QWidget *parent = nullptr);
    ~MainDesigner();

private:
    void InitTestFunTable(void);
    void setHeaderNames(const QString &commandHeader, const QString &actionHeader);
    void parseJsonDate(const QByteArray &json_data);
    void AddTestFunButton(const QList<_fun_tab_struct> &fun_list);
    QList<_fun_tab_struct> ParseTestFunArray(const QJsonArray &func_array);


public slots:
    void slots_displayLog(const QByteArray &txt, QColor color = QColor(Qt::black));

    void slots_serialRead(QByteArray data);
    void onResponseReceived(void);
    void onSendTimeout(void);
    void onKeyButtonClicked(void);
    void sendRequest(const QByteArray &data);
    void processResponse(const QByteArray &data);

signals:
    void sig_serialWrite(QByteArray data);

private slots:
    void on_btnGroupView_clicked();

private:
    Ui::MainDesigner *ui;
    // 右侧视图类型枚举
    enum ViewType {
        GroupView,
        PropertyView,
        JsonView,
        CardView
    };

    ConfigViewManager *m_configViewManager;

    void trimLogContent();
    QTextCodec *m_defaultCodec;

    QList<_fun_tab_struct> test_fun_tab;    //测试函数表
    QMap<QString, QPushButton*> keyButtons; // 存储键名和按钮的映射
    QTimer *responseTimer; // 响应超时定时器
    QString currentRequestKey; // 当前正在等待响应的键名
    QElapsedTimer responseElapsed; // 响应时间计时器
    bool isWaitingResponse; // 是否正在等待响应
    QByteArray lastRequestData; // 最后发送的数据

    QTableWidget *m_tableWidget=nullptr;
};

#endif // MAINDESIGNER_H
